package com.googlecode.horncomb.organ.srvc;

import java.util.Collection;
import java.util.List;

import com.googlecode.horncomb.organ.Relation;

/**
 * @author Daniel
 */
@SuppressWarnings("unchecked")
public interface RelationService {
	// -----------------------------------------------------------
	// create

	/**
	 * 创建关系
	 * @param relation
	 */
	public void create(Relation relation);

	// -----------------------------------------------------------
	// removeFromSource

	/**
	 * 删除指定类型的关系关系.
	 * @param sourceIds
	 *            源Id.
	 * @param targetNatures
	 *            目标类型. 可为空，标识所有类型。
	 * @param relationNatures
	 *            关系类型. 可为空，标识所有类型。
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeFromSource(String sourceId, String[] targetNatures,
			String[] relationNatures, boolean deleted);

	/**
	 * 删除指定类型的关系关系.
	 * @param sourceIds
	 *            源Id.
	 * @param targetNatures
	 *            目标类型. 可为空，标识所有类型。
	 * @param relationNatures
	 *            关系类型. 可为空，标识所有类型。
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeFromSources(Collection<String> sourceIds,
			String[] targetNatures, String[] relationNatures, boolean deleted);

	// -----------------------------------------------------------
	// removeToTarget
	/**
	 * 删除指定类型的关系关系.
	 * @param targetId
	 *            目标Id.
	 * @param sourceNatures
	 *            目标类型. 可为空，标识所有类型。
	 * @param relationNatures
	 *            关系类型. 可为空，表示所有类型。
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeToTarget(String targetId, String[] sourceNatures,
			String[] relationNatures, boolean deleted);

	/**
	 * 删除指定类型的关系关系.
	 * @param targetIds
	 *            目标Id.
	 * @param sourceNatures
	 *            目标类型. 可为空，标识所有类型。
	 * @param relationNatures
	 *            关系类型. 可为空，表示所有类型。
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeToTargets(Collection<String> targetIds,
			String[] sourceNatures, String[] relationNatures, boolean deleted);

	// -----------------------------------------------------------
	// removeBetween
	/**
	 * 删除指定类型的关系关系.
	 * @param sourceId
	 *            源Id.
	 * @param targetIds
	 *            目标Id.
	 * @param relationNatures
	 *            关系类型. 可为空，标识所有类型。
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeBetween(String sourceId, Collection<String> targetIds,
			String[] relationNatures, boolean deleted);

	/**
	 * 删除指定类型的关系关系.
	 * @param sourceIds
	 *            源Id.可以为空，标识全部源
	 * @param targetId
	 *            目标Id.
	 * @param relationNatures
	 *            关系类型. 可为空，表示所有类型。
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeBetween(Collection<String> sourceIds, String targetId,
			String[] relationNatures, boolean deleted);

	/**
	 * 删除指定类型的关系
	 * @param sourceId
	 *            源Id
	 * @param targetId
	 *            目标Id
	 * @param relationNatures
	 *            关系类型. 可为空，标识所有类型.
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeBetween(String sourceId, String targetId,
			String[] relationNatures, boolean deleted);

	// -----------------------------------------------------------
	// removeById

	/**
	 * 删除关系
	 * @param relationshipId
	 *            关系Id
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeById(String relationshipId, boolean deleted);

	/**
	 * 删除关系
	 * @param relationshipIds
	 *            关系Id
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeByIds(Collection<String> relationshipIds, boolean deleted);

	// -----------------------------------------------------------
	// findRelations

	/**
	 * 获取指定类型的关系.源和目标不能同时为空.
	 * @param sourceIds
	 *            源Id. 可为空,表示所有源.
	 * @param targetId
	 *            目标Id. 可为空,标识所有目标.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 源列表
	 */
	public List<? extends Relation> findRelations(Collection<String> sourceIds,
			String targetId, String[] relationNatures);

	/**
	 * 获取指定类型的源.源和目标不能同时为空.
	 * @param sourceId
	 *            源Id. 可为空,表示所有源.
	 * @param targetIds
	 *            目标Id. 可为空,标识所有目标.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 源列表
	 */
	public List<? extends Relation> findRelations(String sourceId,
			Collection<String> targetIds, String[] relationNatures);

	/**
	 * 获取指定类型的源.源和目标不能同时为空.
	 * @param sourceId
	 *            源Id. 可为空,表示所有源.
	 * @param targetId
	 *            目标Id. 可为空,标识所有目标.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 源列表
	 */
	public List<? extends Relation> findRelations(String sourceId,
			String targetId, String[] relationNatures);

	// -----------------------------------------------------------
	// findRelation

	/**
	 * 获取指定类型的源.
	 * @param sourceId
	 *            源Id.
	 * @param targetId
	 *            目标Id.
	 * @param nature
	 *            关系类型.
	 * @return 源列表
	 */
	public Relation get(String sourceId, String targetId, String nature);

	/**
	 * 根据Id获得关系.
	 * @param id
	 *            关系Id.
	 * @return 关系对象.
	 */
	public Relation getById(String id);
}
